from sqlalchemy.orm import Session
from sqlalchemy import select, update, delete, insert
from typing import Optional, Dict, List
from app.api.schemas.hazard import Hazard_Create_Schema, Hazard_Query_Schema, Hazard_Update_Schema
from app.db.model.hazard import Hazard_DB
from sqlalchemy.exc import IntegrityError

# 根据隐患描述获取隐患描述
def get_hazard_by_hazarddesc(db: Session, hazarddesc: str):
    try:
        if hazarddesc is None:
            # 如果没有隐患描述，则查询所有隐患描述
            # 使用SQLAlchemy的select函数构建查询语句
            stmt = (select(Hazard_DB).where(Hazard_DB.del_flag == '0')) 
        else:
            # 如果有隐患描述，则查询对应的隐患描述
            # 使用SQLAlchemy的select函数构建查询语句
            stmt = (select(Hazard_DB).where(Hazard_DB.hazarddesc == hazarddesc).where(Hazard_DB.del_flag == '0'))
        
        res = db.execute(stmt)
        hazard_list = [Hazard_Query_Schema(**hazard.__dict__) for hazard in res.scalars().all()]
        return hazard_list
    except Exception as e:
        # 处理异常，例如记录日志或返回错误信息
        print(f"Error fetching hazard by desc: {e}")
        return []

# 根据隐患描述id获取隐患描述
def get_hazard_by_id(db: Session, hazard_id: str):
    try:
        if hazard_id is None:
            # 如果没有隐患描述id，则查询所有隐患描述
            # 使用SQLAlchemy的select函数构建查询语句
            stmt = (select(Hazard_DB).where(Hazard_DB.del_flag == '0'))
        else:
            # 如果有隐患描述，则查询对应的隐患描述
            # 使用SQLAlchemy的select函数构建查询语句
            stmt = (select(Hazard_DB).where(Hazard_DB.hazard_id == hazard_id).where(Hazard_DB.del_flag == '0'))

        res = db.execute(stmt)
        hazard_list = [Hazard_Query_Schema(**hazard.__dict__) for hazard in res.scalars().all()]
        return hazard_list
    except Exception as e:
        # 处理异常，例如记录日志或返回错误信息
        print(f"Error fetching hazard by id: {e}")
        return []

# 新增隐患描述
def create_hazardinfo(db: Session, hazard: Hazard_Create_Schema):
    """    
    创建新隐患描述的函数
    :param db: 数据库会话对象，用于与数据库交互。
    :param hazard: 包含隐患描述的 Hazard_Schema 对象。
    :return: 一个字符串，表示隐患描述创建成功的消息。
    """
    try:
        # 使用SQLAlchemy的insert函数构建插入语句，插入Hazard_DB表中指定隐患描述的隐患描述记录
        stmt = (insert(Hazard_DB).values(hazard.model_dump()))
        # 执行插入语句
        db.execute(stmt)
        # 提交数据库会话，将隐患描述对象保存到数据库中
        db.commit()
        return "新增隐患描述成功"
    except IntegrityError:
        # 如果发生完整性错误（例如，隐患描述已存在），回滚事务并返回错误消息
        db.rollback()
        return "隐患描述新增失败"
    except Exception as e:
        # 如果发生其他异常，回滚事务并返回错误消息
        db.rollback()
        return f"隐患描述新增失败，发生错误: {str(e)}"

# 更新隐患描述
def update_hazardinfo(db: Session, hazard: Hazard_Update_Schema):
    """
    更新隐患描述的函数
    :param db: 数据库会话对象，用于与数据库交互。
    :param hazard: 包含隐患描述的 Hazard_Schema 对象。
    :return: 一个字符串，表示隐患描述更新成功的消息。
    """
    try:
        # 使用SQLAlchemy的update函数构建更新语句，更新Hazard_DB表中指定隐患描述的隐患描述记录
        stmt = (update(Hazard_DB).where(Hazard_DB.hazard_id == hazard.hazard_id).values(hazard.model_dump()))
        # 执行更新语句
        db.execute(stmt)
        # 提交数据库会话，将更新保存到数据库中
        db.commit()
        # 返回更新后的隐患描述对象
        return hazard
    except Exception as e:
        # 如果发生异常，回滚事务并返回错误消息
        db.rollback()
        return f"隐患描述更新失败，发生错误: {str(e)}"

# 删除隐患描述
def delete_hazardinfo(db: Session, hazardid: str):
    """
    删除隐患描述的函数
    :param db: 数据库会话对象，用于与数据库交互。
    :param hazarddesc: 要删除的隐患描述id。
    :return: 一个字符串，表示隐患描述删除成功的消息。
    """
    try:
        # 使用SQLAlchemy的delete函数构建删除语句，删除Hazard_DB表中指定隐患描述的隐患描述记录,逻辑删除
        stmt = (update(Hazard_DB).where(Hazard_DB.hazard_id == hazardid).values(del_flag='1'))
        # 执行删除语句
        db.execute(stmt)
        # 提交数据库会话，将删除保存到数据库中
        db.commit()
        # 返回删除成功的消息
        return f"隐患描述为{hazardid}的隐患描述删除成功"
    except Exception as e:
        # 如果发生异常，回滚事务并返回错误消息
        db.rollback()
        return f"隐患描述删除失败，发生错误: {str(e)}"
